package com.zgis.module.bas.util.encrypt;

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/**
 * 修改记录:
 * 24-09-29     zhengchaojun             首次创建
 */

/**
 * 类描述：Des加密解密
 */
public class DesUtil
{
    /**
     * 使用DES算法和给定的密钥对字符串进行加密，然后使用Base64进行编码。
     *
     * @param src 要加密的原始字符串。
     * @param key 用于加密的字符串形式的密钥。
     * @return 加密并编码后的字符串。
     * @throws Exception 如果加密或编码过程中发生错误。
     */
    public String encode(String src, String key) throws Exception
    {
        byte[] code1 = this.encode(src.getBytes("UTF-8"), key.getBytes());
        return Base64.encode(code1);
    }

    /**
     * 使用DES算法和给定的密钥对字符串进行加密，然后使用Base64进行编码。
     *
     * @param src 要加密的原始字符串。
     * @param key 用于加密的字节数组形式的密钥。
     * @return 加密并编码后的字符串。
     * @throws Exception 如果加密或编码过程中发生错误。
     */
    public String encode(String src, byte[] key) throws Exception
    {
        byte[] code1 = this.encode(src.getBytes("UTF-8"), key);
        return Base64.encode(code1);
    }

    /**
     * 使用DES算法和给定的密钥对Base64编码的字符串进行解密。
     *
     * @param src 经过Base64编码的加密字符串。
     * @param key 用于解密的字符串形式的密钥。
     * @return 解密后的原始字符串。
     * @throws Exception 如果解密或解码过程中发生错误。
     */
    public String decode(String src, String key) throws Exception
    {
        byte[] code1 = this.decode(Base64.decode(src), key.getBytes());
        return new String(code1, "UTF-8");
    }

    /**
     * 使用DES算法和给定的密钥对Base64编码的字符串进行解密。
     *
     * @param src 经过Base64编码的加密字符串。
     * @param key 用于解密的字节数组形式的密钥。
     * @return 解密后的原始字符串。
     * @throws Exception 如果解密或解码过程中发生错误。
     */
    public String decode(String src, byte[] key) throws Exception
    {
        byte[] code1 = this.decode(Base64.decode(src), key);
        return new String(code1, "UTF-8");
    }

    /**
     * 使用DES算法对字节数组进行加密。
     *
     * @param src 要加密的字节数组。
     * @param key 用于加密的密钥字节数组。
     * @return 加密后的字节数组。
     * @throws Exception 如果加密过程中发生错误。
     */
    private byte[] encode(byte[] src, byte[] key) throws Exception
    {
        SecureRandom     random     = new SecureRandom();
        DESKeySpec       desKey     = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey        securekey  = keyFactory.generateSecret(desKey);
        Cipher           cipher     = Cipher.getInstance("DES");
        cipher.init(1, securekey, random);
        return cipher.doFinal(src);
    }

    /**
     * 使用DES算法对字节数组进行解密。
     *
     * @param src 要解密的字节数组。
     * @param key 用于解密的密钥字节数组。
     * @return 解密后的字节数组。
     * @throws Exception 如果解密过程中发生错误。
     */
    private byte[] decode(byte[] src, byte[] key) throws Exception
    {
        SecureRandom     random     = new SecureRandom();
        DESKeySpec       desKey     = new DESKeySpec(key);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey        securekey  = keyFactory.generateSecret(desKey);
        Cipher           cipher     = Cipher.getInstance("DES");
        cipher.init(2, securekey, random);
        return cipher.doFinal(src);
    }
}
